Teacher Survey Study

Load and clean data

#read csv
ws_012425 <- read_csv('world_survey_difficult_teach_learn_012425.csv')
#view(ws_012425)

#difficult to learn
#pivot to show
ws_012425_diffl <- ws_012425 |>
  dplyr::select(L1_Romance, 35:42)|>
  pivot_longer(cols = 2:9,
                      names_to = "Grammatical Structure",
                      values_to = "Difficulty")|>
  dplyr::mutate(gram_struc =
    case_when(
      `Grammatical Structure` == 'difficult_learn_ser_estar' ~ 'ser and estar',
      `Grammatical Structure` == 'difficult_learn_grammatical_gender_agreement' ~ 'grammatical gender agreement',
      `Grammatical Structure` == 'difficult_learn_pret_imp' ~ 'preterit and imperfect',
      `Grammatical Structure` == 'difficult_learn_subjunctive' ~ 'subjunctive',
      `Grammatical Structure` == 'difficult_learn_por_para' ~ 'por and para',
      `Grammatical Structure` == 'difficult_learn_gustar' ~ 'gustar and gustar-like verbs',
      `Grammatical Structure` == 'difficult_learn_ir' ~ 'ir a + infinitive',
      `Grammatical Structure` == 'difficult_learn_irreg' ~ 'irregular verbs in the present',
    )
  )|>
  drop_na(Difficulty)|>
  #I realize the data is coded from 3= extremely easy, -3 is extremely difficult, so I need to multiply all values by -1
  dplyr::mutate(Difficulty1 = (Difficulty * -1))

#view(ws_012425_diffl)  
  
#let's narrow it down to just a few
ws_012425_diffl_4 <- ws_012425_diffl |>
  dplyr::filter(gram_struc == 'grammatical gender agreement' | 
                  gram_struc =='irregular verbs in the present'|
                  gram_struc =='subjunctive'|
                  gram_struc =='gustar and gustar-like verbs'|
                  gram_struc =='preterit and imperfect')
#view(ws_012425_diffl_4)

Difficult to Learn

#boxplots
ggplot(ws_012425_diffl_4, aes(x=gram_struc, 
                            y=Difficulty1,
                            color = gram_struc
                            )) + 
  geom_boxplot()+
  labs(x = "Grammatical Structure", y = "Difficulty")+
  geom_jitter(shape=1)+
  scale_color_brewer(palette="Set1")+
    theme(axis.text.x = element_text(angle = 45, hjust = 0.80, vjust = 0.9),
        text = element_text(size = 13))+
  ylim(-4, 4)

CEDEL2: Distributional Bias Hypothesis

Correlation: Token Frequency

#pret
pret_token_freq_log <- read_csv('CEDEL2_pret_token_freq_log_22.csv')
Rows: 300 Columns: 13── Column specification ─────────────────────────────────────────────────
Delimiter: ","
chr  (1): verb
dbl (12): L2_freq, NS_freq, L2_freq_log, NS_freq_log, L2_freq_log_reg...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#imp
imp_token_freq_log <- read_csv('CEDEL2_imp_token_freq_log_22.csv')
Rows: 129 Columns: 9── Column specification ─────────────────────────────────────────────────
Delimiter: ","
chr (1): verb
dbl (8): L2_freq, NS_freq, L2_freq_log, NS_freq_log, L2_freq_log_reg,...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#distribution- need non-parametric test
# hist(pret_token_freq_log$NS_freq_log)
# hist(pret_token_freq_log$L2_freq_log)
# hist(imp_token_freq_log$NS_freq_log)
# hist(imp_token_freq_log$L2_freq_log)

#spearman rank correlation
#preterit
cor.test(pret_token_freq_log$NS_freq_log, pret_token_freq_log$L2_freq_log, method = "spearman")
Warning: Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  pret_token_freq_log$NS_freq_log and pret_token_freq_log$L2_freq_log
S = 2071667, p-value < 2.2e-16
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.5396244 
#imperfect
cor.test(imp_token_freq_log$NS_freq_log, imp_token_freq_log$L2_freq_log, method = "spearman")
Warning: Cannot compute exact p-value with ties

    Spearman's rank correlation rho

data:  imp_token_freq_log$NS_freq_log and imp_token_freq_log$L2_freq_log
S = 144765, p-value = 9.978e-14
alternative hypothesis: true rho is not equal to 0
sample estimates:
      rho 
0.5953563 

Preterit

#preterit
#log10
ggplot(pret_token_freq_log, aes(x =NS_freq_log, y = L2_freq_log))+
  geom_point()+
  labs(x = "Log Transformed Frequency in L1 Corpus", 
       y = "Log Transformed Frequency in L2 Corpus")+
  ylim(0,3)+
  xlim(0,3)

Imperfect

#imperfect
#log10
ggplot(imp_token_freq_log, aes(x =NS_freq_log, y = L2_freq_log))+
  geom_point()+
  labs(x = "Log Transformed Frequency in L1 Corpus", 
       y = "Log Transformed Frequency in L2 Corpus")+
  ylim(0,3)+
  xlim(0,3)

Distinctive Collostruction Analysis (DCA): Lemmas + Contingent Frequency

##run the program: Coll.analysis
#source("http://www.stgries.info/teaching/groningen/coll.analysis.r")
#used -log10 (Fisher-Yates exact, one-tailed) (= default) option

#preterit
DCA_CEDEL2_ap <- read_csv('DCA_CEDEL2_ap_22.csv')
#imperfect
DCA_CEDEL2_ai <- read_csv('DCA_CEDEL2_ai_22.csv')

Preterit results

packing <- circleProgressiveLayout(DCA_CEDEL2_ap$coll.strength, sizetype='area')
#view(packing)
data <- cbind(DCA_CEDEL2_ap, packing)
#view(data)
dat.gg <- circleLayoutVertices(packing, npoints=50)
#view(dat.gg)

# Make the plot with a few differences compared to the static version:
p <- ggplot() + 
  geom_polygon_interactive(data = dat.gg, aes(x, y, group = id, fill=id, tooltip = data$text[id], data_id = id), colour = "black", alpha = 0.6) +
  scale_fill_viridis() +
  geom_text(data = data, aes(x, y, label = gsub("Group_", "", words)), size=4, color="black") +
  theme_void() + 
  theme(legend.position="none", plot.margin=unit(c(0,0,0,0),"cm") ) + 
  coord_equal()

# Turn it interactive
girafe(ggobj = p, width_svg = 7, height_svg = 7)

Imperfect results

# Generate the layout
packing1 <- circleProgressiveLayout(DCA_CEDEL2_ai$coll.strength, sizetype='area')
data1 <- cbind(DCA_CEDEL2_ai, packing1)
dat.gg1 <- circleLayoutVertices(packing1, npoints=50)

# Make the plot with a few differences compared to the static version:
p1 <- ggplot() + 
  geom_polygon_interactive(data = dat.gg1, aes(x, y, group = id, fill=id, tooltip = data1$text[id], data_id = id), colour = "black", alpha = 0.6) +
  scale_fill_viridis() +
  geom_text(data = data1, aes(x, y, label = gsub("Group_", "", words)), size=3.5, color="black") +
  theme_void() + 
  theme(legend.position="none", plot.margin=unit(c(0,0,0,0),"cm") ) + 
  coord_equal()
# Turn it interactive
girafe(ggobj = p1, width_svg = 7, height_svg = 7)

COWS-L2H: DPTH & DBH

Suppliance by course

All courses

#read csv
csv18_new_marking_sandbox_pi <- read_csv( 'csv18_new_marking_sandbox_pi_22.csv')
Rows: 140 Columns: 7── Column specification ─────────────────────────────────────────────────
Delimiter: ","
chr (4): quarter, modality, course, Measure
dbl (3): id, Word count, normalized_count_per_100_tokens
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#boxplot
ggplot(csv18_new_marking_sandbox_pi, aes(x=course, 
                                         y=normalized_count_per_100_tokens,
                                         color = Measure)) + 
  geom_boxplot()+
  labs(x = "Course Level", y = "Use of Past Form per 100 Words", color = "Tense-Aspect")+
  geom_jitter(shape=1, width = 0.3)+
  scale_color_brewer(palette="Set1")+
  theme(text = element_text(size = 13))

Just post-instruction

#boxplot just SPA 2
csv18_new_marking_sandbox_pi_2 <- csv18_new_marking_sandbox_pi |>
  dplyr::filter(course == 'SPA 2')
#graph
ggplot(csv18_new_marking_sandbox_pi_2, aes(x=course, 
                                         y=normalized_count_per_100_tokens,
                                         color = Measure)) + 
  geom_boxplot()+
  labs(x = "Course Level", y = "Use of Past Form per 100 Words", color = "Tense-Aspect")+
  geom_jitter(shape=1, width = 0.3)+
  scale_color_brewer(palette="Set1")+
  theme(text = element_text(size = 13))+
  ylim(0, 15)

Accuracy by course

csv18_new_percents_p <- read_csv('csv18_new_percents_p_24.csv')
Rows: 28 Columns: 3── Column specification ─────────────────────────────────────────────────
Delimiter: ","
chr (2): Course level, Tense-aspect form
dbl (1): Percent use
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
ggplot(csv18_new_percents_p, aes(x = `Course level`, y = `Percent use`, fill = `Tense-aspect form`))+
  geom_bar(stat = "identity", position = "stack")+
  #facet_wrap(~n_person1)+
  theme_minimal()+
  #labs(x = "Course level", y = "Percent use of forms in preterit-appropriate contexts")+
  theme(axis.text.x = element_text(angle = 45, hjust = 0.80, vjust = 0.9),
        text = element_text(size = 20))+
  scale_fill_manual(values=c("#669C99", "#9999CC", "#66CCFF", "#CC6666"))

Imperfect

Model: accuracy by course

#cohen's d
cohens_d(appropriateness ~ Proficiency, data = data_cows_SPA12)
Warning: 'y' is numeric but has only 2 unique values.
  If this is a grouping variable, convert it to a factor.
Cohen's d |         95% CI
--------------------------
-1.42     | [-1.63, -1.21]

- Estimated using pooled SD.

Effect plot

#here, I'm trying to create effect plots for this first course level effect

#let's take a look at the dataset
#view(data_cows_SPA12)

#let's plot accuracy by course level
jtools::effect_plot(modelrq3_1, pred = Proficiency,
            x.label = 'Course Level',
            y.label = 'Accuracy'
            )+
  ylim(0, 1.0)
Confidence intervals for merMod models is an experimental feature.
The intervals reflect only the variance of the fixed effects, not
the random effects.

Model: accuracy by tense-aspect

model21_092923 <- glmer(appropriateness ~ Corrected_num + frequency + regularity +
                  (1+ Corrected_num + frequency + regularity||Essay) + (1|infinitive), data_rq1_post_instruction,
                  family = 'binomial', control = glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=50000)))
Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
summary(model21_092923)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: appropriateness ~ Corrected_num + frequency + regularity + (1 +  
    Corrected_num + frequency + regularity || Essay) + (1 | infinitive)
   Data: data_rq1_post_instruction
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 50000))

     AIC      BIC   logLik deviance df.resid 
  1331.9   1392.1   -655.0   1309.9     1753 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-6.1650  0.1388  0.2376  0.3516  1.7647 

Random effects:
 Groups     Name                   Variance Std.Dev. Corr 
 infinitive (Intercept)            0.36056  0.6005        
 Essay      regularity             0.26180  0.5117        
 Essay.1    frequency              0.09777  0.3127        
 Essay.2    Corrected_numimperfect 1.30934  1.1443        
            Corrected_numpreterit  1.08541  1.0418   -0.21
 Essay.3    (Intercept)            1.09286  1.0454        
Number of obs: 1764, groups:  infinitive, 246; Essay, 60

Fixed effects:
                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)             1.1183     0.3059   3.656 0.000256 ***
Corrected_numpreterit   1.7601     0.3470   5.073 3.92e-07 ***
frequency               0.4082     0.1388   2.942 0.003266 ** 
regularity              0.4891     0.3091   1.582 0.113569    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Crrct_ frqncy
Crrctd_nmpr -0.615              
frequency    0.039  0.176       
regularity  -0.360  0.306  0.337
optimizer (bobyqa) convergence code: 0 (OK)
Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?

Effect plot: tense-aspect

#for tense
effect_plot(model21_092923, pred = Corrected_num,
            x.label = 'Tense-aspect',
            y.label = 'Accuracy',
            pred.labels = c('Imperfect', 'Preterit'),
            interval = TRUE)+
  ylim(0, 1.0)
Confidence intervals for merMod models is an experimental feature. The
intervals reflect only the variance of the fixed effects, not the random
effects.

Effect plot: pre vs. post instruction

#for tense
effect_plot(model21_092923, pred = Corrected_num,
            x.label = 'Tense-aspect',
            y.label = 'Accuracy',
            pred.labels = c('Imperfect', 'Preterit'),
            interval = TRUE)+
  ylim(0, 1.0)

Model: accuracy by frequency

Preterit

model3p <- glmer(appropriateness ~ frequency + 
                  (1+ frequency||Essay) + (1|infinitive), data_rq1_post_instruction_pret,
                  family = 'binomial', control = glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=50000)))
summary(model3p)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: appropriateness ~ frequency + (1 + frequency || Essay) + (1 |  
    infinitive)
   Data: data_rq1_post_instruction_pret
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 50000))

     AIC      BIC   logLik deviance df.resid 
   617.1    641.8   -303.5    607.1     1032 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.4198  0.1374  0.2126  0.2899  1.2052 

Random effects:
 Groups     Name        Variance Std.Dev.
 infinitive (Intercept) 0.6037   0.7770  
 Essay      frequency   0.0282   0.1679  
 Essay.1    (Intercept) 2.2406   1.4969  
Number of obs: 1037, groups:  infinitive, 213; Essay, 60

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   2.9066     0.3168   9.174   <2e-16 ***
frequency     0.1082     0.1769   0.612    0.541    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
          (Intr)
frequency 0.249 
#r2
r.squaredGLMM(model3p)
Warning: the null model is correct only if all variables used by the original model remain unchanged.
                    R2m       R2c
theoretical 0.001771195 0.4670640
delta       0.000831001 0.2191349

Imperfect

model3 <- glmer(appropriateness ~ frequency + 
                  (1+ frequency||Essay) + (1|infinitive), data_rq1_post_instruction_imp,
                  family = 'binomial', control = glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=50000)))
summary(model3)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: appropriateness ~ frequency + (1 + frequency || Essay) + (1 |  
    infinitive)
   Data: data_rq1_post_instruction_imp
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 50000))

     AIC      BIC   logLik deviance df.resid 
   712.0    734.9   -351.0    702.0      722 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-6.2212 -0.3672  0.2906  0.4663  2.1492 

Random effects:
 Groups     Name        Variance Std.Dev.
 infinitive (Intercept) 0.3608   0.6007  
 Essay      frequency   0.1874   0.4329  
 Essay.1    (Intercept) 2.5675   1.6024  
Number of obs: 727, groups:  infinitive, 91; Essay, 57

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   1.1437     0.2890   3.957  7.6e-05 ***
frequency     0.4279     0.1829   2.340   0.0193 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
          (Intr)
frequency 0.188 
#r2
r.squaredGLMM(model3)
Warning: the null model is correct only if all variables used by the original model remain unchanged.
                   R2m       R2c
theoretical 0.02473641 0.4992493
delta       0.02082311 0.4202680

Effect plot: preterit

#for frequency
effect_plot(model3p, pred = frequency,
            x.label = 'Frequency (log-transformed)',
            y.label = 'Accuracy',
            interval = TRUE)+
  ylim(0, 1.0)
Confidence intervals for merMod models is an experimental feature. The
intervals reflect only the variance of the fixed effects, not the random
effects.

Effect plot: imperfect

#for frequency
effect_plot(model3, pred = frequency,
            x.label = 'Frequency (log-transformed)',
            y.label = 'Accuracy',
            interval = TRUE)+
  ylim(0, 1.0)
Confidence intervals for merMod models is an experimental feature. The
intervals reflect only the variance of the fixed effects, not the random
effects.

Order of Instruction Intervention

Written Narrative Task

Preterit

cohens_d(csv18_clean_cleanest3_past_pret_i$Appropriate,
         csv18_clean_cleanest3_past_pret_c$Appropriate)
Warning: 'y' is numeric but has only 2 unique values.
  If this is a grouping variable, convert it to a factor.
Cohen's d |        95% CI
-------------------------
0.04      | [-0.13, 0.21]

- Estimated using pooled SD.
#Accuracy by Group
jtools::effect_plot(model2, pred = group,
                    x.label = 'Group',
                    y.label = 'Accuracy'
)+
  ylim(0, 1.0)+
  theme(text = element_text(size = 13))
Confidence intervals for merMod models is an experimental feature. The
intervals reflect only the variance of the fixed effects, not the random
effects.

Imperfect

csv18_clean_cleanest3_past_imp <- read_csv('csv18_clean_cleanest3_past_imp.csv')
Rows: 225 Columns: 15── Column specification ───────────────────────────────────────────────────────────
Delimiter: ","
chr (9): Verb List, Infinitive, Form, Corrected Form, level, group, ID, Correct...
dbl (6): Number, Appropriate, Ambiguous, Inappropriate, Form_num, Corrected_num
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
model3 <- glmer(Appropriate ~ group +
                  (1|ID),
                csv18_clean_cleanest3_past_imp,
                family = 'binomial', 
                control = glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=50000)))
summary(model3)
Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) [
glmerMod]
 Family: binomial  ( logit )
Formula: Appropriate ~ group + (1 | ID)
   Data: csv18_clean_cleanest3_past_imp
Control: glmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 50000))

     AIC      BIC   logLik deviance df.resid 
   292.8    303.0   -143.4    286.8      222 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3890 -0.8445  0.4250  0.6583  1.8292 

Random effects:
 Groups Name        Variance Std.Dev.
 ID     (Intercept) 1.234    1.111   
Number of obs: 225, groups:  ID, 42

Fixed effects:
                   Estimate Std. Error z value Pr(>|z|)
(Intercept)        0.583739   0.383848   1.521    0.128
groupintervention -0.005685   0.494504  -0.011    0.991

Correlation of Fixed Effects:
            (Intr)
gropntrvntn -0.744
r.squaredGLMM(model3)
Warning: the null model is correct only if all variables used by the original model remain unchanged.
                     R2m       R2c
theoretical 1.767995e-06 0.2728413
delta       1.468262e-06 0.2265857
#no group effect
#Accuracy by Group
jtools::effect_plot(model3, pred = group,
                    x.label = 'Group',
                    y.label = 'Accuracy'
)+
  ylim(0, 1.0)+
  theme(text = element_text(size = 13))
Confidence intervals for merMod models is an experimental feature. The
intervals reflect only the variance of the fixed effects, not the random
effects.

Cloze task

#function for scaling
minmaxnormalise <- function(x){(x- min(x)) /(max(x)-min(x))}

#import data
Imp1stUG_012325 <- read_csv('Imp1stUG_012325.csv')|>
  dplyr::mutate(
    score_sqr = (score)^2,
    score_cube = (score)^3,
    score_boxcox = forecast::BoxCox(score, lambda = "auto"),
    #center and scale
    score_bx_scale = scale(score_boxcox, center = TRUE, scale = TRUE),
    Group1 = case_when(
      Group == 'PFG'~ 'control',
      Group == 'IFG'~ 'intervention'
    )
  )
Rows: 429 Columns: 5── Column specification ───────────────────────────────────────────────────────────
Delimiter: ","
chr (4): Term, Group, Section, ID
dbl (1): score
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#view(Imp1stUG_012325)

#visualization of data
hist(Imp1stUG_012325$score_bx_scale)

#roughly normal

#boxplots
ggplot(Imp1stUG_012325, aes(x=Group1, 
                            y=score
                            ,
                            color = Group
                            )) + 
  geom_boxplot()+
  labs(x = "Group", y = "Score")+
  geom_jitter(shape=1, width = 0.3)+
  scale_color_brewer(palette="Set1")+
  theme(text = element_text(size = 13))+
  ylim(0, 40)


#what lambda?
forecast::BoxCox(Imp1stUG_012325$score, lambda = "auto")
  [1]   7.499463  97.484633 391.418692 199.463434 127.478683 449.404392 127.478683
  [8] 161.471628 241.454071 449.404392 241.454071 449.404392 127.478683 449.404392
 [15] 127.478683 241.454071 449.404392 337.431724 287.443509 199.463434 647.353683
 [22] 161.471628 161.471628 337.431724 577.371905 577.371905 337.431724 577.371905
 [29] 241.454071 127.478683 127.478683  49.493382  71.489517 127.478683 337.431724
 [36] 527.509701 594.492475 560.501253 721.334118 464.525616 449.404392  23.997388
 [43] 611.862961 241.454071 299.565679 189.590591 241.454071 479.896759 511.388802
 [50] 449.404392 209.586204 543.880518 230.581523 543.880518 311.937771 377.547068
 [57] 594.492475 275.571263 640.175565  49.493382 230.581523 638.387284 721.334118
 [64] 511.388802 560.501253 560.501253 540.586362 161.471628 717.540128 570.593654
 [71] 647.353683 717.540128 540.586362 573.977782 479.896759 135.602024 441.937499
 [78] 385.840052 372.068397 638.387284 540.586362 638.387284 702.464136 479.896759
 [85] 495.517822 241.454071 143.975296 419.911702 287.443509 143.975296 127.478683
 [92] 419.911702 683.844069 419.911702 337.431724 143.975296 252.576544 287.443509
 [99]  83.987206 363.925365  71.489517 405.540237 337.431724 219.958901 287.443509
[106] 241.454071 449.404392 161.471628 241.454071 449.404392 511.388802 337.431724
[113] 241.454071 161.471628 161.471628 511.388802  17.498279 511.388802 449.404392
[120] 337.431724 337.431724 287.443509 391.418692 449.404392 337.431724 127.478683
[127] 419.911702 665.473918 577.371905 495.517822   1.499953 527.509701 311.937771
[134] 511.388802 189.590591 287.443509 241.454071 350.553584 464.525616 449.404392
[141] 647.353683 629.483364 419.911702  23.997388 391.418692 391.418692 337.431724
[148] 363.925365 179.967675 263.948941 287.443509 179.967675 287.443509 511.388802
[155] 199.463434 363.925365 199.463434 199.463434 363.925365 391.418692  90.610952
[162] 511.388802 363.925365 721.334118 111.981793 449.404392 127.478683 337.431724
[169] 363.925365 252.576544 391.418692 419.911702 449.404392 647.353683 647.353683
[176] 543.880518 479.896759 543.880518 363.925365 391.418692 449.404392 241.454071
[183] 479.896759 449.404392 363.925365 449.404392 479.896759 611.862961 449.404392
[190] 363.925365  97.484633 391.418692 241.454071 199.463434 241.454071 161.471628
[197] 391.418692 337.431724 391.418692  97.484633 449.404392  71.489517 199.463434
[204] 449.404392  71.489517 511.388802 161.471628 511.388802 647.353683  71.489517
[211] 161.471628 391.418692 391.418692 511.388802 511.388802 449.404392 511.388802
[218] 577.371905 647.353683 391.418692 511.388802 647.353683 161.471628 391.418692
[225] 511.388802 449.404392 577.371905  71.489517 449.404392  97.484633  97.484633
[232] 287.443509 577.371905 287.443509 511.388802 161.471628 391.418692 241.454071
[239] 683.844069 611.862961 560.501253 683.844069 511.388802 511.388802 647.353683
[246] 449.404392 511.388802  97.484633 647.353683 683.844069 543.880518 449.404392
[253] 611.862961 311.937771 479.896759 611.862961 683.844069 311.937771 179.967675
[260] 647.353683 721.334118 263.948941 683.844069 419.911702 503.422072 577.371905
[267] 391.418692 647.353683 647.353683 647.353683 560.501253 693.122863 363.925365
[274] 443.425879 721.334118 721.334118 419.911702 611.862961 702.464136 721.334118
[281] 527.509701 611.862961 711.867887 311.937771 464.525616 511.388802 503.422072
[288] 391.418692 511.388802  97.484633 241.454071 577.371905 337.431724 241.454071
[295] 127.478683 577.371905 127.478683 511.388802 241.454071 721.334118 391.418692
[302] 391.418692 199.463434 391.418692  17.498279 449.404392 391.418692 199.463434
[309] 391.418692 241.454071 241.454071 287.443509 511.388802 449.404392 199.463434
[316] 241.454071  97.484633 337.431724 199.463434 577.371905 449.404392 449.404392
[323]  31.496281 577.371905 391.418692 287.443509 449.404392 391.418692 161.471628
[330] 577.371905 127.478683 721.334118 449.404392 161.471628 337.431724 577.371905
[337] 577.371905 127.478683 577.371905 391.418692 161.471628 161.471628 199.463434
[344]  31.496281 241.454071  31.496281   7.499463 511.388802 577.371905 577.371905
[351] 161.471628  49.493382 391.418692 479.896759 337.431724 391.418692 683.844069
[358] 391.418692  59.991574 449.404392 479.896759 721.334118 721.334118 577.371905
[365] 391.418692 391.418692 241.454071 577.371905 449.404392 199.463434 199.463434
[372] 391.418692 577.371905 577.371905 721.334118 577.371905 577.371905 577.371905
[379] 161.471628 127.478683 647.353683 721.334118 199.463434 241.454071 127.478683
[386] 161.471628 391.418692 449.404392  49.493382 449.404392 511.388802 391.418692
[393] 127.478683 241.454071 449.404392 577.371905 577.371905 287.443509 337.431724
[400] 449.404392   1.499953 287.443509 449.404392 511.388802 161.471628  97.484633
[407] 577.371905  17.498279 449.404392 391.418692 337.431724 577.371905 511.388802
[414] 287.443509 337.431724 287.443509 287.443509 647.353683 337.431724 391.418692
[421] 287.443509 337.431724 337.431724 391.418692   1.499953 577.371905  71.489517
[428] 647.353683 241.454071
attr(,"lambda")
[1] 1.999927
# (,"lambda") = 1.999927 (basically square)
#https://rpubs.com/frasermyers/627589

#PFG
Imp1stUG_012325_p <- Imp1stUG_012325 |>
  dplyr::filter(Group == 'PFG')
#view(Imp1stUG_012325_p)

#IFG
Imp1stUG_012325_i <- Imp1stUG_012325 |>
  dplyr::filter(Group == 'IFG')
#view(Imp1stUG_012325_i)

# #histogram: PFG
# hist(Imp1stUG_012325_p$score)
# #better
# hist(Imp1stUG_012325_p$score_sqr)
# #worse
# hist(Imp1stUG_012325_p$score_cube)
# hist(Imp1stUG_012325_p$score_bx_scale)
# 
# 
# #histogram: IFG
# hist(Imp1stUG_012325_i$score)
# hist(Imp1stUG_012325_i$score_sqr)
# #worse
# hist(Imp1stUG_012325_i$score_cube)
# hist(Imp1stUG_012325_i$score_bx_scale)
### LMER1 ####
#group fixed effect, predicting score_bx_scale
#class random effect

M1 <- lmer(score_bx_scale ~ Group +
                   (1 | Section),
           Imp1stUG_012325)
summary(M1)
Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest
]
Formula: score_bx_scale ~ Group + (1 | Section)
   Data: Imp1stUG_012325

REML criterion at convergence: 1172.8

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.53078 -0.77398  0.09862  0.72540  2.37599 

Random effects:
 Groups   Name        Variance Std.Dev.
 Section  (Intercept) 0.1669   0.4086  
 Residual             0.8291   0.9105  
Number of obs: 429, groups:  Section, 21

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)
(Intercept)  0.09527    0.13978 19.83411   0.682    0.503
GroupPFG    -0.23955    0.20091 19.38070  -1.192    0.248

Correlation of Fixed Effects:
         (Intr)
GroupPFG -0.696
#R2
r.squaredGLMM(M1)
            R2m       R2c
[1,] 0.01423152 0.1794556
#gives nice representation of output
tab_model(M1)

#Effect size

effectsize::eta_squared(M1)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Group     |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
LS0tCnRpdGxlOiAiU29waGlhIE1pbm5pbGxvIFByZXNlbnRhdGlvbiBKYW4uIDMxLCAyMDI1IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAnMicKICAgIGRmX3ByaW50OiBwYWdlZAogIGh0bWxfbm90ZWJvb2s6CiAgICBkZl9wcmludDogcGFnZWQKICAgIHRvYzogdHJ1ZQogICAgdG9jX2RlcHRoOiAyCiAgcGRmX2RvY3VtZW50OgogICAgdG9jOiB0cnVlCiAgICB0b2NfZGVwdGg6ICcyJwphbHdheXNfYWxsb3dfaHRtbDogdHJ1ZQotLS0KCiMgVGVhY2hlciBTdXJ2ZXkgU3R1ZHkKCmBgYHtyLCByZXN1bHRzPSdoaWRlJywgbWVzc2FnZT1GQUxTRX0KI2xvYWQgcGFja2FnZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShicm9vbSkKbGlicmFyeShsbWU0KQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGFmZXgpCmxpYnJhcnkoc2pQbG90KQpsaWJyYXJ5KGVmZmVjdHMpCmxpYnJhcnkoc2pzdGF0cykKbGlicmFyeShuZ3JhbXIpCmxpYnJhcnkoUm1pc2MpICNmb3IgU3VtbWFyeVNFCmxpYnJhcnkocGx5cikKbGlicmFyeShkcGx5cikKbGlicmFyeShyc3RhdGl4KQpsaWJyYXJ5KGVtbWVhbnMpCmxpYnJhcnkoTXVNSW4pCmxpYnJhcnkobG1lclRlc3QpCmxpYnJhcnkoZWZmZWN0c2l6ZSkKbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShnZ2lyYXBoKQpsaWJyYXJ5KHBhY2tjaXJjbGVzKQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkoaHRtbHdpZGdldHMpCmxpYnJhcnkoanRvb2xzKQpgYGAKCkxvYWQgYW5kIGNsZWFuIGRhdGEKCmBgYHtyLCByZXN1bHRzPSdoaWRlJywgbWVzc2FnZT1GQUxTRX0KI3JlYWQgY3N2CndzXzAxMjQyNSA8LSByZWFkX2Nzdignd29ybGRfc3VydmV5X2RpZmZpY3VsdF90ZWFjaF9sZWFybl8wMTI0MjUuY3N2JykKI3ZpZXcod3NfMDEyNDI1KQoKI2RpZmZpY3VsdCB0byBsZWFybgojcGl2b3QgdG8gc2hvdwp3c18wMTI0MjVfZGlmZmwgPC0gd3NfMDEyNDI1IHw+CiAgZHBseXI6OnNlbGVjdChMMV9Sb21hbmNlLCAzNTo0Mil8PgogIHBpdm90X2xvbmdlcihjb2xzID0gMjo5LAogICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiR3JhbW1hdGljYWwgU3RydWN0dXJlIiwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc190byA9ICJEaWZmaWN1bHR5Iil8PgogIGRwbHlyOjptdXRhdGUoZ3JhbV9zdHJ1YyA9CiAgICBjYXNlX3doZW4oCiAgICAgIGBHcmFtbWF0aWNhbCBTdHJ1Y3R1cmVgID09ICdkaWZmaWN1bHRfbGVhcm5fc2VyX2VzdGFyJyB+ICdzZXIgYW5kIGVzdGFyJywKICAgICAgYEdyYW1tYXRpY2FsIFN0cnVjdHVyZWAgPT0gJ2RpZmZpY3VsdF9sZWFybl9ncmFtbWF0aWNhbF9nZW5kZXJfYWdyZWVtZW50JyB+ICdncmFtbWF0aWNhbCBnZW5kZXIgYWdyZWVtZW50JywKICAgICAgYEdyYW1tYXRpY2FsIFN0cnVjdHVyZWAgPT0gJ2RpZmZpY3VsdF9sZWFybl9wcmV0X2ltcCcgfiAncHJldGVyaXQgYW5kIGltcGVyZmVjdCcsCiAgICAgIGBHcmFtbWF0aWNhbCBTdHJ1Y3R1cmVgID09ICdkaWZmaWN1bHRfbGVhcm5fc3VianVuY3RpdmUnIH4gJ3N1Ymp1bmN0aXZlJywKICAgICAgYEdyYW1tYXRpY2FsIFN0cnVjdHVyZWAgPT0gJ2RpZmZpY3VsdF9sZWFybl9wb3JfcGFyYScgfiAncG9yIGFuZCBwYXJhJywKICAgICAgYEdyYW1tYXRpY2FsIFN0cnVjdHVyZWAgPT0gJ2RpZmZpY3VsdF9sZWFybl9ndXN0YXInIH4gJ2d1c3RhciBhbmQgZ3VzdGFyLWxpa2UgdmVyYnMnLAogICAgICBgR3JhbW1hdGljYWwgU3RydWN0dXJlYCA9PSAnZGlmZmljdWx0X2xlYXJuX2lyJyB+ICdpciBhICsgaW5maW5pdGl2ZScsCiAgICAgIGBHcmFtbWF0aWNhbCBTdHJ1Y3R1cmVgID09ICdkaWZmaWN1bHRfbGVhcm5faXJyZWcnIH4gJ2lycmVndWxhciB2ZXJicyBpbiB0aGUgcHJlc2VudCcsCiAgICApCiAgKXw+CiAgZHJvcF9uYShEaWZmaWN1bHR5KXw+CiAgI0kgcmVhbGl6ZSB0aGUgZGF0YSBpcyBjb2RlZCBmcm9tIDM9IGV4dHJlbWVseSBlYXN5LCAtMyBpcyBleHRyZW1lbHkgZGlmZmljdWx0LCBzbyBJIG5lZWQgdG8gbXVsdGlwbHkgYWxsIHZhbHVlcyBieSAtMQogIGRwbHlyOjptdXRhdGUoRGlmZmljdWx0eTEgPSAoRGlmZmljdWx0eSAqIC0xKSkKCiN2aWV3KHdzXzAxMjQyNV9kaWZmbCkgIAogIAojbGV0J3MgbmFycm93IGl0IGRvd24gdG8ganVzdCBhIGZldwp3c18wMTI0MjVfZGlmZmxfNCA8LSB3c18wMTI0MjVfZGlmZmwgfD4KICBkcGx5cjo6ZmlsdGVyKGdyYW1fc3RydWMgPT0gJ2dyYW1tYXRpY2FsIGdlbmRlciBhZ3JlZW1lbnQnIHwgCiAgICAgICAgICAgICAgICAgIGdyYW1fc3RydWMgPT0naXJyZWd1bGFyIHZlcmJzIGluIHRoZSBwcmVzZW50J3wKICAgICAgICAgICAgICAgICAgZ3JhbV9zdHJ1YyA9PSdzdWJqdW5jdGl2ZSd8CiAgICAgICAgICAgICAgICAgIGdyYW1fc3RydWMgPT0nZ3VzdGFyIGFuZCBndXN0YXItbGlrZSB2ZXJicyd8CiAgICAgICAgICAgICAgICAgIGdyYW1fc3RydWMgPT0ncHJldGVyaXQgYW5kIGltcGVyZmVjdCcpCiN2aWV3KHdzXzAxMjQyNV9kaWZmbF80KQpgYGAKCkRpZmZpY3VsdCB0byBMZWFybgoKYGBge3J9CiNib3hwbG90cwpnZ3Bsb3Qod3NfMDEyNDI1X2RpZmZsXzQsIGFlcyh4PWdyYW1fc3RydWMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeT1EaWZmaWN1bHR5MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gZ3JhbV9zdHJ1YwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgKyAKICBnZW9tX2JveHBsb3QoKSsKICBsYWJzKHggPSAiR3JhbW1hdGljYWwgU3RydWN0dXJlIiwgeSA9ICJEaWZmaWN1bHR5IikrCiAgZ2VvbV9qaXR0ZXIoc2hhcGU9MSkrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSsKICAgIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMC44MCwgdmp1c3QgPSAwLjkpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkrCiAgeWxpbSgtNCwgNCkKYGBgCgoKIyBDRURFTDI6IERpc3RyaWJ1dGlvbmFsIEJpYXMgSHlwb3RoZXNpcwoKIyMgQ29ycmVsYXRpb246IFRva2VuIEZyZXF1ZW5jeQoKYGBge3J9CiNwcmV0CnByZXRfdG9rZW5fZnJlcV9sb2cgPC0gcmVhZF9jc3YoJ0NFREVMMl9wcmV0X3Rva2VuX2ZyZXFfbG9nXzIyLmNzdicpCiNpbXAKaW1wX3Rva2VuX2ZyZXFfbG9nIDwtIHJlYWRfY3N2KCdDRURFTDJfaW1wX3Rva2VuX2ZyZXFfbG9nXzIyLmNzdicpCgojZGlzdHJpYnV0aW9uLSBuZWVkIG5vbi1wYXJhbWV0cmljIHRlc3QKIyBoaXN0KHByZXRfdG9rZW5fZnJlcV9sb2ckTlNfZnJlcV9sb2cpCiMgaGlzdChwcmV0X3Rva2VuX2ZyZXFfbG9nJEwyX2ZyZXFfbG9nKQojIGhpc3QoaW1wX3Rva2VuX2ZyZXFfbG9nJE5TX2ZyZXFfbG9nKQojIGhpc3QoaW1wX3Rva2VuX2ZyZXFfbG9nJEwyX2ZyZXFfbG9nKQoKI3NwZWFybWFuIHJhbmsgY29ycmVsYXRpb24KI3ByZXRlcml0CmNvci50ZXN0KHByZXRfdG9rZW5fZnJlcV9sb2ckTlNfZnJlcV9sb2csIHByZXRfdG9rZW5fZnJlcV9sb2ckTDJfZnJlcV9sb2csIG1ldGhvZCA9ICJzcGVhcm1hbiIpCiNpbXBlcmZlY3QKY29yLnRlc3QoaW1wX3Rva2VuX2ZyZXFfbG9nJE5TX2ZyZXFfbG9nLCBpbXBfdG9rZW5fZnJlcV9sb2ckTDJfZnJlcV9sb2csIG1ldGhvZCA9ICJzcGVhcm1hbiIpCgpgYGAKUHJldGVyaXQKCmBgYHtyfQojcHJldGVyaXQKI2xvZzEwCmdncGxvdChwcmV0X3Rva2VuX2ZyZXFfbG9nLCBhZXMoeCA9TlNfZnJlcV9sb2csIHkgPSBMMl9mcmVxX2xvZykpKwogIGdlb21fcG9pbnQoKSsKICBsYWJzKHggPSAiTG9nIFRyYW5zZm9ybWVkIEZyZXF1ZW5jeSBpbiBMMSBDb3JwdXMiLCAKICAgICAgIHkgPSAiTG9nIFRyYW5zZm9ybWVkIEZyZXF1ZW5jeSBpbiBMMiBDb3JwdXMiKSsKICB5bGltKDAsMykrCiAgeGxpbSgwLDMpCmBgYAoKSW1wZXJmZWN0CgpgYGB7cn0KI2ltcGVyZmVjdAojbG9nMTAKZ2dwbG90KGltcF90b2tlbl9mcmVxX2xvZywgYWVzKHggPU5TX2ZyZXFfbG9nLCB5ID0gTDJfZnJlcV9sb2cpKSsKICBnZW9tX3BvaW50KCkrCiAgbGFicyh4ID0gIkxvZyBUcmFuc2Zvcm1lZCBGcmVxdWVuY3kgaW4gTDEgQ29ycHVzIiwgCiAgICAgICB5ID0gIkxvZyBUcmFuc2Zvcm1lZCBGcmVxdWVuY3kgaW4gTDIgQ29ycHVzIikrCiAgeWxpbSgwLDMpKwogIHhsaW0oMCwzKQpgYGAKCgojIyBEaXN0aW5jdGl2ZSBDb2xsb3N0cnVjdGlvbiBBbmFseXNpcyAoRENBKTogTGVtbWFzICsgQ29udGluZ2VudCBGcmVxdWVuY3kKCmBgYHtyLCByZXN1bHRzPSdoaWRlJ30KIyNydW4gdGhlIHByb2dyYW06IENvbGwuYW5hbHlzaXMKI3NvdXJjZSgiaHR0cDovL3d3dy5zdGdyaWVzLmluZm8vdGVhY2hpbmcvZ3JvbmluZ2VuL2NvbGwuYW5hbHlzaXMuciIpCiN1c2VkIC1sb2cxMCAoRmlzaGVyLVlhdGVzIGV4YWN0LCBvbmUtdGFpbGVkKSAoPSBkZWZhdWx0KSBvcHRpb24KCiNwcmV0ZXJpdApEQ0FfQ0VERUwyX2FwIDwtIHJlYWRfY3N2KCdEQ0FfQ0VERUwyX2FwXzIyLmNzdicpCiNpbXBlcmZlY3QKRENBX0NFREVMMl9haSA8LSByZWFkX2NzdignRENBX0NFREVMMl9haV8yMi5jc3YnKQpgYGAKUHJldGVyaXQgcmVzdWx0cwoKYGBge3J9CnBhY2tpbmcgPC0gY2lyY2xlUHJvZ3Jlc3NpdmVMYXlvdXQoRENBX0NFREVMMl9hcCRjb2xsLnN0cmVuZ3RoLCBzaXpldHlwZT0nYXJlYScpCiN2aWV3KHBhY2tpbmcpCmRhdGEgPC0gY2JpbmQoRENBX0NFREVMMl9hcCwgcGFja2luZykKI3ZpZXcoZGF0YSkKZGF0LmdnIDwtIGNpcmNsZUxheW91dFZlcnRpY2VzKHBhY2tpbmcsIG5wb2ludHM9NTApCiN2aWV3KGRhdC5nZykKCiMgTWFrZSB0aGUgcGxvdCB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzIGNvbXBhcmVkIHRvIHRoZSBzdGF0aWMgdmVyc2lvbjoKcCA8LSBnZ3Bsb3QoKSArIAogIGdlb21fcG9seWdvbl9pbnRlcmFjdGl2ZShkYXRhID0gZGF0LmdnLCBhZXMoeCwgeSwgZ3JvdXAgPSBpZCwgZmlsbD1pZCwgdG9vbHRpcCA9IGRhdGEkdGV4dFtpZF0sIGRhdGFfaWQgPSBpZCksIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGdlb21fdGV4dChkYXRhID0gZGF0YSwgYWVzKHgsIHksIGxhYmVsID0gZ3N1YigiR3JvdXBfIiwgIiIsIHdvcmRzKSksIHNpemU9NCwgY29sb3I9ImJsYWNrIikgKwogIHRoZW1lX3ZvaWQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QubWFyZ2luPXVuaXQoYygwLDAsMCwwKSwiY20iKSApICsgCiAgY29vcmRfZXF1YWwoKQoKIyBUdXJuIGl0IGludGVyYWN0aXZlCmdpcmFmZShnZ29iaiA9IHAsIHdpZHRoX3N2ZyA9IDcsIGhlaWdodF9zdmcgPSA3KQpgYGAKCkltcGVyZmVjdCByZXN1bHRzCgpgYGB7cn0KIyBHZW5lcmF0ZSB0aGUgbGF5b3V0CnBhY2tpbmcxIDwtIGNpcmNsZVByb2dyZXNzaXZlTGF5b3V0KERDQV9DRURFTDJfYWkkY29sbC5zdHJlbmd0aCwgc2l6ZXR5cGU9J2FyZWEnKQpkYXRhMSA8LSBjYmluZChEQ0FfQ0VERUwyX2FpLCBwYWNraW5nMSkKZGF0LmdnMSA8LSBjaXJjbGVMYXlvdXRWZXJ0aWNlcyhwYWNraW5nMSwgbnBvaW50cz01MCkKCiMgTWFrZSB0aGUgcGxvdCB3aXRoIGEgZmV3IGRpZmZlcmVuY2VzIGNvbXBhcmVkIHRvIHRoZSBzdGF0aWMgdmVyc2lvbjoKcDEgPC0gZ2dwbG90KCkgKyAKICBnZW9tX3BvbHlnb25faW50ZXJhY3RpdmUoZGF0YSA9IGRhdC5nZzEsIGFlcyh4LCB5LCBncm91cCA9IGlkLCBmaWxsPWlkLCB0b29sdGlwID0gZGF0YTEkdGV4dFtpZF0sIGRhdGFfaWQgPSBpZCksIGNvbG91ciA9ICJibGFjayIsIGFscGhhID0gMC42KSArCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKwogIGdlb21fdGV4dChkYXRhID0gZGF0YTEsIGFlcyh4LCB5LCBsYWJlbCA9IGdzdWIoIkdyb3VwXyIsICIiLCB3b3JkcykpLCBzaXplPTMuNSwgY29sb3I9ImJsYWNrIikgKwogIHRoZW1lX3ZvaWQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QubWFyZ2luPXVuaXQoYygwLDAsMCwwKSwiY20iKSApICsgCiAgY29vcmRfZXF1YWwoKQojIFR1cm4gaXQgaW50ZXJhY3RpdmUKZ2lyYWZlKGdnb2JqID0gcDEsIHdpZHRoX3N2ZyA9IDcsIGhlaWdodF9zdmcgPSA3KQpgYGAKCiMgQ09XUy1MMkg6IERQVEggJiBEQkgKCiMjIFN1cHBsaWFuY2UgYnkgY291cnNlCgpBbGwgY291cnNlcwpgYGB7cn0KI3JlYWQgY3N2CmNzdjE4X25ld19tYXJraW5nX3NhbmRib3hfcGkgPC0gcmVhZF9jc3YoICdjc3YxOF9uZXdfbWFya2luZ19zYW5kYm94X3BpXzIyLmNzdicpCgojYm94cGxvdApnZ3Bsb3QoY3N2MThfbmV3X21hcmtpbmdfc2FuZGJveF9waSwgYWVzKHg9Y291cnNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PW5vcm1hbGl6ZWRfY291bnRfcGVyXzEwMF90b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBNZWFzdXJlKSkgKyAKICBnZW9tX2JveHBsb3QoKSsKICBsYWJzKHggPSAiQ291cnNlIExldmVsIiwgeSA9ICJVc2Ugb2YgUGFzdCBGb3JtIHBlciAxMDAgV29yZHMiLCBjb2xvciA9ICJUZW5zZS1Bc3BlY3QiKSsKICBnZW9tX2ppdHRlcihzaGFwZT0xLCB3aWR0aCA9IDAuMykrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCgpgYGAKCkp1c3QgcG9zdC1pbnN0cnVjdGlvbgoKYGBge3J9CiNib3hwbG90IGp1c3QgU1BBIDIKY3N2MThfbmV3X21hcmtpbmdfc2FuZGJveF9waV8yIDwtIGNzdjE4X25ld19tYXJraW5nX3NhbmRib3hfcGkgfD4KICBkcGx5cjo6ZmlsdGVyKGNvdXJzZSA9PSAnU1BBIDInKQojZ3JhcGgKZ2dwbG90KGNzdjE4X25ld19tYXJraW5nX3NhbmRib3hfcGlfMiwgYWVzKHg9Y291cnNlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PW5vcm1hbGl6ZWRfY291bnRfcGVyXzEwMF90b2tlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBNZWFzdXJlKSkgKyAKICBnZW9tX2JveHBsb3QoKSsKICBsYWJzKHggPSAiQ291cnNlIExldmVsIiwgeSA9ICJVc2Ugb2YgUGFzdCBGb3JtIHBlciAxMDAgV29yZHMiLCBjb2xvciA9ICJUZW5zZS1Bc3BlY3QiKSsKICBnZW9tX2ppdHRlcihzaGFwZT0xLCB3aWR0aCA9IDAuMykrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpKwogIHlsaW0oMCwgMTUpCmBgYAoKIyMgQWNjdXJhY3kgYnkgY291cnNlCgpgYGB7cn0KY3N2MThfbmV3X3BlcmNlbnRzX3AgPC0gcmVhZF9jc3YoJ2NzdjE4X25ld19wZXJjZW50c19wXzI0LmNzdicpCmdncGxvdChjc3YxOF9uZXdfcGVyY2VudHNfcCwgYWVzKHggPSBgQ291cnNlIGxldmVsYCwgeSA9IGBQZXJjZW50IHVzZWAsIGZpbGwgPSBgVGVuc2UtYXNwZWN0IGZvcm1gKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gInN0YWNrIikrCiAgI2ZhY2V0X3dyYXAofm5fcGVyc29uMSkrCiAgdGhlbWVfbWluaW1hbCgpKwogICNsYWJzKHggPSAiQ291cnNlIGxldmVsIiwgeSA9ICJQZXJjZW50IHVzZSBvZiBmb3JtcyBpbiBwcmV0ZXJpdC1hcHByb3ByaWF0ZSBjb250ZXh0cyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMC44MCwgdmp1c3QgPSAwLjkpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2NjlDOTkiLCAiIzk5OTlDQyIsICIjNjZDQ0ZGIiwgIiNDQzY2NjYiKSkKCmBgYAoKSW1wZXJmZWN0CgpgYGB7cn0KY3N2MThfbmV3X3BlcmNlbnRzX2kgPC0gcmVhZF9jc3YoJ2NzdjE4X25ld19wZXJjZW50c19pXzI0LmNzdicpCiNwbG90CmdncGxvdChjc3YxOF9uZXdfcGVyY2VudHNfaSwgYWVzKHggPSBgQ291cnNlIGxldmVsYCwgeSA9IGBQZXJjZW50IHVzZWAsIGZpbGwgPSBgVGVuc2UtYXNwZWN0IGZvcm1gKSkrCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gInN0YWNrIikrCiAgI2ZhY2V0X3dyYXAofm5fcGVyc29uMSkrCiAgdGhlbWVfbWluaW1hbCgpKwogICNsYWJzKHggPSAiQ291cnNlIGxldmVsIiwgeSA9ICJQZXJjZW50IHVzZSBvZiBmb3JtcyBpbiBwcmV0ZXJpdC1hcHByb3ByaWF0ZSBjb250ZXh0cyIpKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMC44MCwgdmp1c3QgPSAwLjkpLAogICAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkrCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIiM2NjlDOTkiLCAiIzk5OTlDQyIsICIjQ0M2NjY2IiwgIiM2NkNDRkYiKSkKCmBgYAoKCiMjIE1vZGVsOiBhY2N1cmFjeSBieSBjb3Vyc2UKCmBgYHtyfQojcmVhZCBjc3YKZGF0YV9jb3dzX1NQQTEyIDwtIHJlYWRfY3N2KCdkYXRhX2Nvd3NfU1BBMTJfMjQuY3N2JykKI3ZpZXcoZGF0YV9jb3dzX1NQQTEyKQoKbW9kZWxycTNfMSA8LSBnbG1lcihhcHByb3ByaWF0ZW5lc3MgfiBQcm9maWNpZW5jeSArCiAgICAgICAgICAgICAgICAgICAgICAoMXxFc3NheSkgKyAoMXxpbmZpbml0aXZlKSwgZGF0YV9jb3dzX1NQQTEyLAogICAgICAgICAgICAgICAgICBmYW1pbHkgPSAnYmlub21pYWwnLCBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplcj0iYm9ieXFhIiwgb3B0Q3RybD1saXN0KG1heGZ1bj01MDAwMCkpKQoKI2FwcHJvcHJpYXRlICgwPW5vLCAxPXllcykgfiAKIyogUHJvZmljaWVuY3kgKyByYW5kb20gZWZmZWN0IGZvciBlc3NheSBhbmQgaW5maW5pdGl2ZQpzdW1tYXJ5KG1vZGVscnEzXzEpCgojZ2V0IFJeMiB0b28Kci5zcXVhcmVkR0xNTShtb2RlbHJxM18xKQoKI2NvaGVuJ3MgZApjb2hlbnNfZChhcHByb3ByaWF0ZW5lc3MgfiBQcm9maWNpZW5jeSwgZGF0YSA9IGRhdGFfY293c19TUEExMikKYGBgCgpFZmZlY3QgcGxvdAoKYGBge3J9CiNoZXJlLCBJJ20gdHJ5aW5nIHRvIGNyZWF0ZSBlZmZlY3QgcGxvdHMgZm9yIHRoaXMgZmlyc3QgY291cnNlIGxldmVsIGVmZmVjdAoKI2xldCdzIHRha2UgYSBsb29rIGF0IHRoZSBkYXRhc2V0CiN2aWV3KGRhdGFfY293c19TUEExMikKCiNsZXQncyBwbG90IGFjY3VyYWN5IGJ5IGNvdXJzZSBsZXZlbApqdG9vbHM6OmVmZmVjdF9wbG90KG1vZGVscnEzXzEsIHByZWQgPSBQcm9maWNpZW5jeSwKICAgICAgICAgICAgeC5sYWJlbCA9ICdDb3Vyc2UgTGV2ZWwnLAogICAgICAgICAgICB5LmxhYmVsID0gJ0FjY3VyYWN5JwogICAgICAgICAgICApKwogIHlsaW0oMCwgMS4wKQpgYGAKCgojIyBNb2RlbDogYWNjdXJhY3kgYnkgdGVuc2UtYXNwZWN0CgpgYGB7ciwgZWNobyA9IEZBTFNFLCByZXN1bHRzPSdoaWRlJ30KZGF0YV9ycTFfcG9zdF9pbnN0cnVjdGlvbiA8LSByZWFkX2NzdignZGF0YV9ycTFfcG9zdF9pbnN0cnVjdGlvbl8yNC5jc3YnKQogICNub3csIHdlJ2xsIGJlIGNvbnNpZGVyaW5nIHRlbnNlIChiaW5hcnkpLCByZWd1bGFyaXR5IChiaW5hcnkpLCBhbmQgZnJlcXVlbmN5IChsb2ctdHJhbnNmb3JtZWQgY29udGludW91cykKI3RlbnNlIGFuZCByZWd1bGFyaXR5IHdpbGwgYmVjb21lICsvLSAwLjUKCiNub3cgbGV0J3MgY2VudGVyIGFuZCBzY2FsZSB0aGUgZnJlcXVlbmN5IGRhdGEKY2VudGVyX3NjYWxlIDwtIGZ1bmN0aW9uKHgpIHsKICAgIHNjYWxlKHgsIHNjYWxlID0gVFJVRSkKfQoKI25lZWQgdG8gY2VudGVyIHRoZSBjb3Vyc2UgbGV2ZWxzCiNTUEEgMiA9IC0yLjUKI1NQQSAzID0gLTEuNQojU1BBIDIxID0gLS41CiNTUEEgMjIgPSAuNQojU1BBIDIzID0gMS41CiNTUEEgMjQgPSAyLjUKCiN0dXJuIFByb2ZpY2llbmN5IGxldmVscyBpbnRvIGNlbnRlcmVkIHZhcmlhYmxlCmRhdGFfcnExX3Bvc3RfaW5zdHJ1Y3Rpb24gPC0gZGF0YV9ycTFfcG9zdF9pbnN0cnVjdGlvbiAlPiUKICBtdXRhdGUoY291cnNlX2xldmVsID0gY2FzZV93aGVuKAogICAgUHJvZmljaWVuY3kgPT0gJ1NQQSAyJyB+ICdsZXZlbCAyJywKICAgIFByb2ZpY2llbmN5ID09ICdTUEEgMycgfiAnbGV2ZWwgMycsCiAgICBQcm9maWNpZW5jeSA9PSAnU1BBIDIxJyB+ICdsZXZlbCA0JywKICAgIFByb2ZpY2llbmN5ID09ICdTUEEgMjInIH4gJ2xldmVsIDUnLAogICAgUHJvZmljaWVuY3kgPT0gJ1NQQSAyMycgfiAnbGV2ZWwgNicsCiAgICBQcm9maWNpZW5jeSA9PSAnU1BBIDI0JyB+ICdsZXZlbCA3JwogICkpJT4lCiAgbXV0YXRlKGNvdXJzZV9sZXZlbF9jb250ID0gY2FzZV93aGVuKAogICAgUHJvZmljaWVuY3kgPT0gJ1NQQSAyJyB+IC0yLjUsCiAgICBQcm9maWNpZW5jeSA9PSAnU1BBIDMnIH4gLTEuNSwKICAgIFByb2ZpY2llbmN5ID09ICdTUEEgMjEnIH4gLTAuNSwKICAgIFByb2ZpY2llbmN5ID09ICdTUEEgMjInIH4gMC41LAogICAgUHJvZmljaWVuY3kgPT0gJ1NQQSAyMycgfiAxLjUsCiAgICBQcm9maWNpZW5jeSA9PSAnU1BBIDI0JyB+IDIuNQogICkpJT4lCiAgbXV0YXRlKHRlbnNlID0gY2FzZV93aGVuKAogICAgQ29ycmVjdGVkX251bSA9PSAnaW1wZXJmZWN0JyB+IC0wLjUsICNpbXBlcmZlY3QgbmVnYXRpdmUKICAgIENvcnJlY3RlZF9udW0gPT0gJ3ByZXRlcml0JyB+IDAuNSAjcHJldGVyaXQgcG9zaXRpdmUKICApKSU+JQogIG11dGF0ZShyZWd1bGFyaXR5ID0gY2FzZV93aGVuKAogICAgUmVndWxhcml0eSA9PSAnSScgfiAtMC41LCAjaXJyZWd1bGFyIGlzIC0wLjUKICAgIFJlZ3VsYXJpdHkgPT0gJ1InIH4gMC41ICNyZWd1bGFyIGlzIDAuNSAocG9zaXRpdmUpCiAgKSklPiUKICBtdXRhdGUoCiAgICAjY2hhbmdlIDExLTExLTIyOiBmcmVxdWVuY3kgYXMgc3VtX2xvZ19mcnEKICAgIGZyZXF1ZW5jeSA9IGNlbnRlcl9zY2FsZShkYXRhX3JxMV9wb3N0X2luc3RydWN0aW9uJGxvZ19zdW1fZnJxKQogICAgI2ZyZXF1ZW5jeSBub3cgcmFuZ2VzIGZyb20gYXBwcm94LiAtMi43IHRvICsxLjUzCiAgKSU+JQogIGRyb3BfbmEocmVndWxhcml0eSklPiUgI2dldHRpbmcgcmlkIG9mIE5Bcywgc3RpbGwgMTgwMSBvYnNlcnZhdGlvbnMKICBtdXRhdGUoCiAgICBpbmZpbml0aXZlID0gdG9sb3dlcihJbmZpbml0aXZlX25vX3JlZmxleCkKICApCgojanVzdCB0aGUgcHJldGVyaXQKZGF0YV9ycTFfcG9zdF9pbnN0cnVjdGlvbl9wcmV0IDwtIGRhdGFfcnExX3Bvc3RfaW5zdHJ1Y3Rpb24lPiUKICBmaWx0ZXIoQ29ycmVjdGVkX251bSA9PSAncHJldGVyaXQnKQojdmlldyhkYXRhX3JxMV9wb3N0X2luc3RydWN0aW9uX3ByZXQpCgojanVzdCB0aGUgaW1wZXJmZWN0CmRhdGFfcnExX3Bvc3RfaW5zdHJ1Y3Rpb25faW1wIDwtIGRhdGFfcnExX3Bvc3RfaW5zdHJ1Y3Rpb24lPiUKICBmaWx0ZXIoQ29ycmVjdGVkX251bSA9PSAnaW1wZXJmZWN0JykKI3ZpZXcoZGF0YV9ycTFfcG9zdF9pbnN0cnVjdGlvbl9pbXApCmBgYApgYGB7cn0KI3RlbnNlLWFzcGVjdCBhcyBjYXRlZ29yaWNhbAptb2RlbDIxXzA5MjkyMyA8LSBnbG1lcihhcHByb3ByaWF0ZW5lc3MgfiBDb3JyZWN0ZWRfbnVtICsgZnJlcXVlbmN5ICsgcmVndWxhcml0eSArCiAgICAgICAgICAgICAgICAgICgxKyBDb3JyZWN0ZWRfbnVtICsgZnJlcXVlbmN5ICsgcmVndWxhcml0eXx8RXNzYXkpICsgKDF8aW5maW5pdGl2ZSksIGRhdGFfcnExX3Bvc3RfaW5zdHJ1Y3Rpb24sCiAgICAgICAgICAgICAgICAgIGZhbWlseSA9ICdiaW5vbWlhbCcsIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyPSJib2J5cWEiLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTUwMDAwKSkpCnN1bW1hcnkobW9kZWwyMV8wOTI5MjMpCgojdGVuc2UtYXNwZWN0IGFzIGNlbnRlcmVkIGFuZCBzY2FsZWQKbW9kZWwyMSA8LSBnbG1lcihhcHByb3ByaWF0ZW5lc3MgfiB0ZW5zZSArIGZyZXF1ZW5jeSArIHJlZ3VsYXJpdHkgKwogICAgICAgICAgICAgICAgICAoMSsgdGVuc2UgKyBmcmVxdWVuY3kgKyByZWd1bGFyaXR5fHxFc3NheSkgKyAoMXxpbmZpbml0aXZlKSwgZGF0YV9ycTFfcG9zdF9pbnN0cnVjdGlvbiwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gJ2Jpbm9taWFsJywgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsIG9wdEN0cmw9bGlzdChtYXhmdW49NTAwMDApKSkKc3VtbWFyeShtb2RlbDIxKQpgYGAKCiMjIyBFZmZlY3QgcGxvdDogdGVuc2UtYXNwZWN0CgpgYGB7cn0KI2ZvciB0ZW5zZQplZmZlY3RfcGxvdChtb2RlbDIxXzA5MjkyMywgcHJlZCA9IENvcnJlY3RlZF9udW0sCiAgICAgICAgICAgIHgubGFiZWwgPSAnVGVuc2UtYXNwZWN0JywKICAgICAgICAgICAgeS5sYWJlbCA9ICdBY2N1cmFjeScsCiAgICAgICAgICAgIHByZWQubGFiZWxzID0gYygnSW1wZXJmZWN0JywgJ1ByZXRlcml0JyksCiAgICAgICAgICAgIGludGVydmFsID0gVFJVRSkrCiAgeWxpbSgwLCAxLjApCmBgYAoKIyMjIEVmZmVjdCBwbG90OiBwcmUgdnMuIHBvc3QgaW5zdHJ1Y3Rpb24KCmBgYHtyfQojZm9yIHRlbnNlCmVmZmVjdF9wbG90KG1vZGVsMjFfMDkyOTIzLCBwcmVkID0gQ29ycmVjdGVkX251bSwKICAgICAgICAgICAgeC5sYWJlbCA9ICdUZW5zZS1hc3BlY3QnLAogICAgICAgICAgICB5LmxhYmVsID0gJ0FjY3VyYWN5JywKICAgICAgICAgICAgcHJlZC5sYWJlbHMgPSBjKCdJbXBlcmZlY3QnLCAnUHJldGVyaXQnKSwKICAgICAgICAgICAgaW50ZXJ2YWwgPSBUUlVFKSsKICB5bGltKDAsIDEuMCkKCmBgYAoKCiMjIE1vZGVsOiBhY2N1cmFjeSBieSBmcmVxdWVuY3kKClByZXRlcml0CgpgYGB7cn0KbW9kZWwzcCA8LSBnbG1lcihhcHByb3ByaWF0ZW5lc3MgfiBmcmVxdWVuY3kgKyAKICAgICAgICAgICAgICAgICAgKDErIGZyZXF1ZW5jeXx8RXNzYXkpICsgKDF8aW5maW5pdGl2ZSksIGRhdGFfcnExX3Bvc3RfaW5zdHJ1Y3Rpb25fcHJldCwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gJ2Jpbm9taWFsJywgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsIG9wdEN0cmw9bGlzdChtYXhmdW49NTAwMDApKSkKc3VtbWFyeShtb2RlbDNwKQoKI3IyCnIuc3F1YXJlZEdMTU0obW9kZWwzcCkKYGBgCgpJbXBlcmZlY3QKCmBgYHtyfQptb2RlbDMgPC0gZ2xtZXIoYXBwcm9wcmlhdGVuZXNzIH4gZnJlcXVlbmN5ICsgCiAgICAgICAgICAgICAgICAgICgxKyBmcmVxdWVuY3l8fEVzc2F5KSArICgxfGluZmluaXRpdmUpLCBkYXRhX3JxMV9wb3N0X2luc3RydWN0aW9uX2ltcCwKICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gJ2Jpbm9taWFsJywgY29udHJvbCA9IGdsbWVyQ29udHJvbChvcHRpbWl6ZXI9ImJvYnlxYSIsIG9wdEN0cmw9bGlzdChtYXhmdW49NTAwMDApKSkKc3VtbWFyeShtb2RlbDMpCiNyMgpyLnNxdWFyZWRHTE1NKG1vZGVsMykKYGBgCgoKIyMjIEVmZmVjdCBwbG90OiBwcmV0ZXJpdApgYGB7cn0KI2ZvciBmcmVxdWVuY3kKZWZmZWN0X3Bsb3QobW9kZWwzcCwgcHJlZCA9IGZyZXF1ZW5jeSwKICAgICAgICAgICAgeC5sYWJlbCA9ICdGcmVxdWVuY3kgKGxvZy10cmFuc2Zvcm1lZCknLAogICAgICAgICAgICB5LmxhYmVsID0gJ0FjY3VyYWN5JywKICAgICAgICAgICAgaW50ZXJ2YWwgPSBUUlVFKSsKICB5bGltKDAsIDEuMCkKYGBgCgojIyMgRWZmZWN0IHBsb3Q6IGltcGVyZmVjdAoKYGBge3J9CiNmb3IgZnJlcXVlbmN5CmVmZmVjdF9wbG90KG1vZGVsMywgcHJlZCA9IGZyZXF1ZW5jeSwKICAgICAgICAgICAgeC5sYWJlbCA9ICdGcmVxdWVuY3kgKGxvZy10cmFuc2Zvcm1lZCknLAogICAgICAgICAgICB5LmxhYmVsID0gJ0FjY3VyYWN5JywKICAgICAgICAgICAgaW50ZXJ2YWwgPSBUUlVFKSsKICB5bGltKDAsIDEuMCkKYGBgCgojIE9yZGVyIG9mIEluc3RydWN0aW9uIEludGVydmVudGlvbgoKIyMgV3JpdHRlbiBOYXJyYXRpdmUgVGFzawoKIyMjIFByZXRlcml0CgpgYGB7cn0KY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfcHJldCA8LSByZWFkX2NzdignY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfcHJldC5jc3YnKQptb2RlbDIgPC0gZ2xtZXIoQXBwcm9wcmlhdGUgfiBncm91cCArCiAgICAgICAgICAgICAgICAgICgxfElEKSwKICAgICAgICAgICAgICAgIGNzdjE4X2NsZWFuX2NsZWFuZXN0M19wYXN0X3ByZXQsCiAgICAgICAgICAgICAgICBmYW1pbHkgPSAnYmlub21pYWwnLCAKICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBnbG1lckNvbnRyb2wob3B0aW1pemVyPSJib2J5cWEiLCBvcHRDdHJsPWxpc3QobWF4ZnVuPTUwMDAwKSkpCnN1bW1hcnkobW9kZWwyKQpqdG9vbHM6OnN1bW0obW9kZWwyKQpyLnNxdWFyZWRHTE1NKG1vZGVsMikKCiNubyBncm91cCBlZmZlY3QKCiNjb2hlbidzIGQKY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfcHJldF9jIDwtIGNzdjE4X2NsZWFuX2NsZWFuZXN0M19wYXN0X3ByZXQgfD4KICBkcGx5cjo6ZmlsdGVyKGdyb3VwPT0gJ2NvbnRyb2wnKQojdmlldyhjc3YxOF9jbGVhbl9jbGVhbmVzdDNfcGFzdF9wcmV0X2MpCgpjc3YxOF9jbGVhbl9jbGVhbmVzdDNfcGFzdF9wcmV0X2kgPC0gY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfcHJldCB8PgogIGRwbHlyOjpmaWx0ZXIoZ3JvdXAgPT0gJ2ludGVydmVudGlvbicpCiN2aWV3KGNzdjE4X2NsZWFuX2NsZWFuZXN0M19wYXN0X3ByZXRfaSkKCiN1c2luZyB0aGlzCmNvaGVuc19kKGNzdjE4X2NsZWFuX2NsZWFuZXN0M19wYXN0X3ByZXRfaSRBcHByb3ByaWF0ZSwKICAgICAgICAgY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfcHJldF9jJEFwcHJvcHJpYXRlKQoKYGBgCmBgYHtyfQojQWNjdXJhY3kgYnkgR3JvdXAKanRvb2xzOjplZmZlY3RfcGxvdChtb2RlbDIsIHByZWQgPSBncm91cCwKICAgICAgICAgICAgICAgICAgICB4LmxhYmVsID0gJ0dyb3VwJywKICAgICAgICAgICAgICAgICAgICB5LmxhYmVsID0gJ0FjY3VyYWN5JwopKwogIHlsaW0oMCwgMS4wKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpCmBgYAoKIyMjIEltcGVyZmVjdAoKYGBge3J9CmNzdjE4X2NsZWFuX2NsZWFuZXN0M19wYXN0X2ltcCA8LSByZWFkX2NzdignY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfaW1wLmNzdicpCm1vZGVsMyA8LSBnbG1lcihBcHByb3ByaWF0ZSB+IGdyb3VwICsKICAgICAgICAgICAgICAgICAgKDF8SUQpLAogICAgICAgICAgICAgICAgY3N2MThfY2xlYW5fY2xlYW5lc3QzX3Bhc3RfaW1wLAogICAgICAgICAgICAgICAgZmFtaWx5ID0gJ2Jpbm9taWFsJywgCiAgICAgICAgICAgICAgICBjb250cm9sID0gZ2xtZXJDb250cm9sKG9wdGltaXplcj0iYm9ieXFhIiwgb3B0Q3RybD1saXN0KG1heGZ1bj01MDAwMCkpKQpzdW1tYXJ5KG1vZGVsMykKci5zcXVhcmVkR0xNTShtb2RlbDMpCgojbm8gZ3JvdXAgZWZmZWN0CmBgYAoKYGBge3J9CiNBY2N1cmFjeSBieSBHcm91cApqdG9vbHM6OmVmZmVjdF9wbG90KG1vZGVsMywgcHJlZCA9IGdyb3VwLAogICAgICAgICAgICAgICAgICAgIHgubGFiZWwgPSAnR3JvdXAnLAogICAgICAgICAgICAgICAgICAgIHkubGFiZWwgPSAnQWNjdXJhY3knCikrCiAgeWxpbSgwLCAxLjApKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEzKSkKYGBgCgoKIyMgQ2xvemUgdGFzawoKYGBge3J9CiNmdW5jdGlvbiBmb3Igc2NhbGluZwptaW5tYXhub3JtYWxpc2UgPC0gZnVuY3Rpb24oeCl7KHgtIG1pbih4KSkgLyhtYXgoeCktbWluKHgpKX0KCiNpbXBvcnQgZGF0YQpJbXAxc3RVR18wMTIzMjUgPC0gcmVhZF9jc3YoJ0ltcDFzdFVHXzAxMjMyNS5jc3YnKXw+CiAgZHBseXI6Om11dGF0ZSgKICAgIHNjb3JlX3NxciA9IChzY29yZSleMiwKICAgIHNjb3JlX2N1YmUgPSAoc2NvcmUpXjMsCiAgICBzY29yZV9ib3hjb3ggPSBmb3JlY2FzdDo6Qm94Q294KHNjb3JlLCBsYW1iZGEgPSAiYXV0byIpLAogICAgI2NlbnRlciBhbmQgc2NhbGUKICAgIHNjb3JlX2J4X3NjYWxlID0gc2NhbGUoc2NvcmVfYm94Y294LCBjZW50ZXIgPSBUUlVFLCBzY2FsZSA9IFRSVUUpLAogICAgR3JvdXAxID0gY2FzZV93aGVuKAogICAgICBHcm91cCA9PSAnUEZHJ34gJ2NvbnRyb2wnLAogICAgICBHcm91cCA9PSAnSUZHJ34gJ2ludGVydmVudGlvbicKICAgICkKICApCiN2aWV3KEltcDFzdFVHXzAxMjMyNSkKCiN2aXN1YWxpemF0aW9uIG9mIGRhdGEKaGlzdChJbXAxc3RVR18wMTIzMjUkc2NvcmVfYnhfc2NhbGUpCiNyb3VnaGx5IG5vcm1hbAoKI2JveHBsb3RzCmdncGxvdChJbXAxc3RVR18wMTIzMjUsIGFlcyh4PUdyb3VwMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5PXNjb3JlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IEdyb3VwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSArIAogIGdlb21fYm94cGxvdCgpKwogIGxhYnMoeCA9ICJHcm91cCIsIHkgPSAiU2NvcmUiKSsKICBnZW9tX2ppdHRlcihzaGFwZT0xLCB3aWR0aCA9IDAuMykrCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNldDEiKSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMykpKwogIHlsaW0oMCwgNDApCgojd2hhdCBsYW1iZGE/CiNmb3JlY2FzdDo6Qm94Q294KEltcDFzdFVHXzAxMjMyNSRzY29yZSwgbGFtYmRhID0gImF1dG8iKQojICgsImxhbWJkYSIpID0gMS45OTk5MjcgKGJhc2ljYWxseSBzcXVhcmUpCiNodHRwczovL3JwdWJzLmNvbS9mcmFzZXJteWVycy82Mjc1ODkKCiNQRkcKSW1wMXN0VUdfMDEyMzI1X3AgPC0gSW1wMXN0VUdfMDEyMzI1IHw+CiAgZHBseXI6OmZpbHRlcihHcm91cCA9PSAnUEZHJykKI3ZpZXcoSW1wMXN0VUdfMDEyMzI1X3ApCgojSUZHCkltcDFzdFVHXzAxMjMyNV9pIDwtIEltcDFzdFVHXzAxMjMyNSB8PgogIGRwbHlyOjpmaWx0ZXIoR3JvdXAgPT0gJ0lGRycpCiN2aWV3KEltcDFzdFVHXzAxMjMyNV9pKQoKIyAjaGlzdG9ncmFtOiBQRkcKIyBoaXN0KEltcDFzdFVHXzAxMjMyNV9wJHNjb3JlKQojICNiZXR0ZXIKIyBoaXN0KEltcDFzdFVHXzAxMjMyNV9wJHNjb3JlX3NxcikKIyAjd29yc2UKIyBoaXN0KEltcDFzdFVHXzAxMjMyNV9wJHNjb3JlX2N1YmUpCiMgaGlzdChJbXAxc3RVR18wMTIzMjVfcCRzY29yZV9ieF9zY2FsZSkKIyAKIyAKIyAjaGlzdG9ncmFtOiBJRkcKIyBoaXN0KEltcDFzdFVHXzAxMjMyNV9pJHNjb3JlKQojIGhpc3QoSW1wMXN0VUdfMDEyMzI1X2kkc2NvcmVfc3FyKQojICN3b3JzZQojIGhpc3QoSW1wMXN0VUdfMDEyMzI1X2kkc2NvcmVfY3ViZSkKIyBoaXN0KEltcDFzdFVHXzAxMjMyNV9pJHNjb3JlX2J4X3NjYWxlKQoKYGBgCgpgYGB7cn0KIyMjIExNRVIxICMjIyMKI2dyb3VwIGZpeGVkIGVmZmVjdCwgcHJlZGljdGluZyBzY29yZV9ieF9zY2FsZQojY2xhc3MgcmFuZG9tIGVmZmVjdAoKTTEgPC0gbG1lcihzY29yZV9ieF9zY2FsZSB+IEdyb3VwICsKICAgICAgICAgICAgICAgICAgICgxIHwgU2VjdGlvbiksCiAgICAgICAgICAgSW1wMXN0VUdfMDEyMzI1KQpzdW1tYXJ5KE0xKQoKI1IyCnIuc3F1YXJlZEdMTU0oTTEpCiNnaXZlcyBuaWNlIHJlcHJlc2VudGF0aW9uIG9mIG91dHB1dAp0YWJfbW9kZWwoTTEpCgojRWZmZWN0IHNpemUKCmVmZmVjdHNpemU6OmV0YV9zcXVhcmVkKE0xKQpgYGAKCg==